home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 April / macformat-049.iso / mac / Shareware Plus / Developers / dropg++ / usr / include / sys / buf.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-20  |  7.8 KB  |  179 lines  |  [TEXT/R*ch]

  1. /*
  2.  * Copyright (c) 1982, 1986, 1989, 1993
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  * (c) UNIX System Laboratories, Inc.
  5.  * All or some portions of this file are derived from material licensed
  6.  * to the University of California by American Telephone and Telegraph
  7.  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
  8.  * the permission of UNIX System Laboratories, Inc.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *    This product includes software developed by the University of
  21.  *    California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  *    @(#)buf.h    8.7 (Berkeley) 1/21/94
  39.  */
  40.  
  41. #ifndef _SYS_BUF_H_
  42. #define    _SYS_BUF_H_
  43. #include <sys/queue.h>
  44.  
  45. #define NOLIST ((struct buf *)0x87654321)
  46.  
  47. /*
  48.  * The buffer header describes an I/O operation in the kernel.
  49.  */
  50. struct buf {
  51.     LIST_ENTRY(buf) b_hash;        /* Hash chain. */
  52.     LIST_ENTRY(buf) b_vnbufs;    /* Buffer's associated vnode. */
  53.     TAILQ_ENTRY(buf) b_freelist;    /* Free list position if not active. */
  54.     struct    buf *b_actf, **b_actb;    /* Device driver queue when active. */
  55.     struct  proc *b_proc;        /* Associated proc; NULL if kernel. */
  56.     volatile long    b_flags;    /* B_* flags. */
  57.     int    b_error;        /* Errno value. */
  58.     long    b_bufsize;        /* Allocated buffer size. */
  59.     long    b_bcount;        /* Valid bytes in buffer. */
  60.     long    b_resid;        /* Remaining I/O. */
  61.     dev_t    b_dev;            /* Device associated with buffer. */
  62.     struct {
  63.         caddr_t    b_addr;        /* Memory, superblocks, indirect etc. */
  64.     } b_un;
  65.     void    *b_saveaddr;        /* Original b_addr for physio. */
  66.     daddr_t    b_lblkno;        /* Logical block number. */
  67.     daddr_t    b_blkno;        /* Underlying physical block number. */
  68.                     /* Function to call upon completion. */
  69.     void    (*b_iodone) __P((struct buf *));
  70.     struct    vnode *b_vp;        /* Device vnode. */
  71.     int    b_pfcent;        /* Center page when swapping cluster. */
  72.     int    b_dirtyoff;        /* Offset in buffer of dirty region. */
  73.     int    b_dirtyend;        /* Offset of end of dirty region. */
  74.     struct    ucred *b_rcred;        /* Read credentials reference. */
  75.     struct    ucred *b_wcred;        /* Write credentials reference. */
  76.     int    b_validoff;        /* Offset in buffer of valid region. */
  77.     int    b_validend;        /* Offset of end of valid region. */
  78. };
  79.  
  80. /* Device driver compatibility definitions. */
  81. #define    b_active b_bcount        /* Driver queue head: drive active. */
  82. #define    b_data     b_un.b_addr        /* b_un.b_addr is not changeable. */
  83. #define    b_errcnt b_resid        /* Retry count while I/O in progress. */
  84. #define    iodone     biodone        /* Old name for biodone. */
  85. #define    iowait     biowait        /* Old name for biowait. */
  86.  
  87. /*
  88.  * These flags are kept in b_flags.
  89.  */
  90. #define    B_AGE        0x00000001    /* Move to age queue when I/O done. */
  91. #define    B_APPENDWRITE    0x00000002    /* Append-write in progress. */
  92. #define    B_ASYNC        0x00000004    /* Start I/O, do not wait. */
  93. #define    B_BAD        0x00000008    /* Bad block revectoring in progress. */
  94. #define    B_BUSY        0x00000010    /* I/O in progress. */
  95. #define    B_CACHE        0x00000020    /* Bread found us in the cache. */
  96. #define    B_CALL        0x00000040    /* Call b_iodone from biodone. */
  97. #define    B_DELWRI    0x00000080    /* Delay I/O until buffer reused. */
  98. #define    B_DIRTY        0x00000100    /* Dirty page to be pushed out async. */
  99. #define    B_DONE        0x00000200    /* I/O completed. */
  100. #define    B_EINTR        0x00000400    /* I/O was interrupted */
  101. #define    B_ERROR        0x00000800    /* I/O error occurred. */
  102. #define    B_GATHERED    0x00001000    /* LFS: already in a segment. */
  103. #define    B_INVAL        0x00002000    /* Does not contain valid info. */
  104. #define    B_LOCKED    0x00004000    /* Locked in core (not reusable). */
  105. #define    B_NOCACHE    0x00008000    /* Do not cache block after use. */
  106. #define    B_PAGET        0x00010000    /* Page in/out of page table space. */
  107. #define    B_PGIN        0x00020000    /* Pagein op, so swap() can count it. */
  108. #define    B_PHYS        0x00040000    /* I/O to user memory. */
  109. #define    B_RAW        0x00080000    /* Set by physio for raw transfers. */
  110. #define    B_READ        0x00100000    /* Read buffer. */
  111. #define    B_TAPE        0x00200000    /* Magnetic tape I/O. */
  112. #define    B_UAREA        0x00400000    /* Buffer describes Uarea I/O. */
  113. #define    B_WANTED    0x00800000    /* Process wants this buffer. */
  114. #define    B_WRITE        0x00000000    /* Write buffer (pseudo flag). */
  115. #define    B_WRITEINPROG    0x01000000    /* Write in progress. */
  116. #define    B_XXX        0x02000000    /* Debugging flag. */
  117.  
  118. /*
  119.  * This structure describes a clustered I/O.  It is stored in the b_saveaddr
  120.  * field of the buffer on which I/O is done.  At I/O completion, cluster
  121.  * callback uses the structure to parcel I/O's to individual buffers, and
  122.  * then free's this structure.
  123.  */
  124. struct cluster_save {
  125.     long    bs_bcount;        /* Saved b_bcount. */
  126.     long    bs_bufsize;        /* Saved b_bufsize. */
  127.     void    *bs_saveaddr;        /* Saved b_addr. */
  128.     int    bs_nchildren;        /* Number of associated buffers. */
  129.     struct buf **bs_children;    /* List of associated buffers. */
  130. };
  131.  
  132. /*
  133.  * Zero out the buffer's data area.
  134.  */
  135. #define    clrbuf(bp) {                            \
  136.     blkclr((bp)->b_data, (u_int)(bp)->b_bcount);            \
  137.     (bp)->b_resid = 0;                        \
  138. }
  139.  
  140. /* Flags to low-level allocation routines. */
  141. #define B_CLRBUF    0x01    /* Request allocated buffer be cleared. */
  142. #define B_SYNC        0x02    /* Do all allocations synchronously. */
  143.  
  144. #ifdef KERNEL
  145. int    nbuf;            /* The number of buffer headers */
  146. struct    buf *buf;        /* The buffer headers. */
  147. char    *buffers;        /* The buffer contents. */
  148. int    bufpages;        /* Number of memory pages in the buffer pool. */
  149. struct    buf *swbuf;        /* Swap I/O buffer headers. */
  150. int    nswbuf;            /* Number of swap I/O buffer headers. */
  151. struct    buf bswlist;        /* Head of swap I/O buffer headers free list. */
  152. struct    buf *bclnlist;        /* Head of cleaned page list. */
  153.  
  154. __BEGIN_DECLS
  155. int    allocbuf __P((struct buf *, int));
  156. int    bawrite __P((struct buf *));
  157. int    bdwrite __P((struct buf *));
  158. void    biodone __P((struct buf *));
  159. int    biowait __P((struct buf *));
  160. int    bread __P((struct vnode *, daddr_t, int,
  161.         struct ucred *, struct buf **));
  162. int    breadn __P((struct vnode *, daddr_t, int, daddr_t *, int *, int,
  163.         struct ucred *, struct buf **));
  164. int    brelse __P((struct buf *));
  165. void    bufinit __P((void));
  166. int    bwrite __P((struct buf *));
  167. void    cluster_callback __P((struct buf *));
  168. int    cluster_read __P((struct vnode *, u_quad_t, daddr_t, long,
  169.         struct ucred *, struct buf **));
  170. void    cluster_write __P((struct buf *, u_quad_t));
  171. struct buf *getblk __P((struct vnode *, daddr_t, int, int, int));
  172. struct buf *geteblk __P((int));
  173. struct buf *getnewbuf __P((int slpflag, int slptimeo));
  174. struct buf *incore __P((struct vnode *, daddr_t));
  175. u_int    minphys __P((struct buf *bp));
  176. __END_DECLS
  177. #endif
  178. #endif /* !_SYS_BUF_H_ */
  179.